跳到主要内容

FFmpeg 视频处理工具快速入门上手

以下理论部分,实践和命令直接看 命令实践

关于视频处理的重要概念

  • 编解码:分软件和硬件
  • 硬件加速:支持英特尔、英伟达、AMD 等显卡加速
  • 视频质量:帧率、分辨率、码率
  • 修改视频:剪接、合并、裁剪黑边等(复杂的操作建议上剪辑工具)

快速概念入门

一、编解码

编码将媒体数据编译成可播放的媒体文件 —> 媒体文件打开调用对应的编码方式将其解码播放。

简单理解为:存储媒体(编码) → 打开媒体(解码);

复杂的是,编解码有很多种不同的方式,如:h264、h265、hevc、av1等。编解方式需要对应才能顺利打开媒体,多种格式的存在一方面是软硬件迭代,另一方面是应对不同的场景。

二、硬件加速

处理媒体是计算机消耗最多性能的工作,纯粹考软件的方式处理是非常低效的。这时就需要硬件的加入,如 GPU 加速。

实际上是通过厂商的硬件驱动去进行加速编码。

以下 API 是各系统与各硬件厂商的支持情况。

同样的编码动作,开启硬件加速少则速度翻倍,甚至可以翻几倍(看显卡性能)

三、视频质量

  • 帧率(Frame Rate):帧率是指每秒显示的图像帧数。它决定了视频播放时的流畅度,通常以“每秒帧数”(fps)来衡量。常见的帧率包括 24fps、30fps 和 60fps。越低帧率看的画面就像卡卡的感觉。【目前60帧暂时是比较舒适的】
  • 分辨率(Resolution):分辨率是指图像或视频的清晰度和细节水平。它通常以像素为单位来表示,例如1920x1080表示宽度为1920像素,高度为1080像素。分辨率越高,图像越清晰,但文件大小也会增加。常见的视频分辨率包括720p(1280x720)、1080p(1920x1080)和4K(3840x2160)等。
  • 码率(Bitrate):码率是指在视频或音频中传输的数据量,通常以每秒的比特数(bps)来表示。它影响视频或音频文件的质量和文件大小。较高的码率通常会导致更高质量的输出,但也会增加文件大小。码率与视频质量和分辨率密切相关,因为更高的分辨率和质量通常需要更高的码率来保持良好的表现。

小结:**帧率决定流畅、分辨率决定清晰度、码率确定画面质量。**判断视频好坏最直接的公式:码率 > 分辨率 ≈ 帧率。(前提是720p 24帧,如果有错就一定是我错)

什么是 ffmpeg

关键:媒体转换器、命令行操作工具。Ffmpeg 是一个通用的媒体转换器。它可以读取各种各样的输入-包括实时抓取/记录设备-过滤,并将它们转换成不同的输出格式。

ffmpeg 的工作流1

 _______              ______________
| | | |
| input | demuxer | encoded data | decoder
| file | ---------> | packets | -----+
|_______| |______________| |
v
_________
| |
| decoded |
| frames |
|_________|
________ ______________ |
| | | | |
| output | <-------- | encoded data | <----+
| file | muxer | packets | encoder
|________| |______________|

编、解码器与硬件加速

查看硬件加速技术

普遍有以下几种技术,不同的系统环境和硬件会有所不同。

ffmpeg -hwaccels

  • qsv:intel显卡的快速视频同步技术(quick sync video)
  • nvenc:nvidia显卡的硬件视频编码器(nvidia hardware video encoder)
  • cuvid:nvdec的旧称,只有解码端。
  • cuda: 同上
  • amf:amd显卡的amf硬件编码器(amd hardware encoder)

查看编、解码器

下面的代码中如使用 bash 命令,将 sls 更换为 grep 即可。

解码器基本是英特尔 qsv 和 NVIDIA cuvid 的天下,没AMD什么事了

ffmpeg -decoders | sls h264
#VFS..D h264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
#V....D h264_qsv H264 video (Intel Quick Sync Video acceleration) (codec h264)
#V..... h264_cuvid Nvidia CUVID H264 decoder (codec h264)

查看硬件支持的编码器(一般硬件支持的编码较少,独显或更高规格的显卡才支持)

ffmpeg -encoders | sls h264
#V....D h264_amf AMD AMF H.264 Encoder (codec h264)
#V....D h264_mf H264 via MediaFoundation (codec h264)
#V....D h264_nvenc NVIDIA NVENC H.264 encoder (codec h264)
#V..... h264_qsv H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration) (codec h264)

码率、分辨率、帧率

影响视频文件大小比重:码率 > 分辨率 > 帧率

  • 码率:-b:v 4500k (4500k-高质量,2000k-勉强接受,文件大小与质量比较适中)
  • 分辨率:-s 1280x720 or hd720hd1080
  • 帧率:-crf 24 影响文件大小不如码率和分辨率,一般不需要设置,低于 24 帧会严重影响观感

命令实践

视频处理

一、快速剪辑

从开始到结束,假如结束无需剪辑即可忽略

-vcodec copy -acodec copy 意思是对音视频源不作处理,或者使用 -c copy 不对音视频作处理

ffmpeg -i test.mp4 -ss 00:00:09 -to 00:00:44 -vcodec copy -acodec copy output.mp4

二、多个视频剪辑

💡 windows 的版本若无法使用,可通过 wsl 运行 Linux 子系统使用


ffmpeg -i test.mp4 -filter_complex \
"[0:v]trim=start=0:end=17,setpts=PTS-STARTPTS[a]; \
[0:v]trim=start=25:end=110,setpts=PTS-STARTPTS[b]; \
[a][b]concat[out];" -map [out] out.mp4

三、合并视频

方法一:

ffmpeg -f concat -i concat:"1.mp4|2.mp4" -c copy output.mp4

方法二:

使用文件入参,先创建一个 concat.txt 文件

# 写入
file 1.mp4
file 2.mp4
ffmpeg -f concat -i concat.txt -c copy output.mp4

使用过滤器处理视频

提升输出速度,记得加入硬件加速。如:AMD集显:h264_amf ; N卡独显:h264_nvenc

  1. 实现多个视频剪辑、合并
  2. 裁剪视频比例
  3. 去除水印
  4. 去除马赛克
  5. …..等

一、去除水印

  • B站 1080 视频水印位置大概 x=1600:y=30:w=300:h=90
  • B站 720 视频水印位置 x=1068:y=16:w:200:h=70
# -filter_complex "[0:v]delogo=x=1600:y=30:w=300:h=90"
ffmpeg -i 'test.mp4' -filter_complex "[0:v]delogo=x=1600:y=30:w=300:h=90" output.mp4

二、去除马赛克

-filter:v 表示视频滤镜,minterpolate 表示使用 minterpolate 滤镜,mi_mode=mcimc_mode=aobmcmb_size=8 分别表示帧间插值算法、运动补偿算法和块大小

ffmpeg -i input.mp4 -filter:v "minterpolate='mi_mode=mci:mc_mode=aobmc:mb_size=8'" -ss 0 -t 60 -c:a copy output.mp4

三、添加转场

ffmpeg -i input_1.mp4 -i input_2.mp4 -filter_complex "xfade=transition=fade:duration=2:offset=2" output.mp4

参考资料

  1. 如何使用FFmpeg从视频中删除多个片段
  2. 给新手的 20 多个 FFmpeg 命令示例 - 知乎
  3. FFMPEG 使用显卡加速转码 - 掘金
  4. FFmpeg 硬件加速介绍 - 简书

Footnotes

  1. ffmpeg 官网:https://ffmpeg.org/ffmpeg.html#Detailed-description